#ifndef EVENTMANAGER_H
#define EVENTMANAGER_H

#include <list>
#include <mutex>
#include <thread>

class EventManager
{
public:
    typedef void (*EventCallback)(int eventId , void* user_ctx);

//类公共方法
public:
    EventManager( const char* name );
    ~EventManager();

    /**
      @brief 启动事件管理器
      @return true:成功 false:失败
     */
    bool start();

    /**
      @brief 停止事件管理器
      @return true:成功 false:失败
    */
    bool stop();

    /**
      @brief 事件管理器是否运行
      @return true:正在运行 flase:未运行
    */
    bool isActive();

    /**
      @brief 添加一个事件回调
      @param callback_name 回调名字
      @param callback 回调函数
      @param eventId 事件ID
      @param userCtx 事件发送时一同传入回调的参数
      @return true:成功 flase:失败
    */
    bool registerEventCallback( const char* callback_name , EventCallback callback , int eventId , void* userCtx = NULL);


    /**
      @brief 发送一个事件
      @param eventId 事件ID
      @return true:成功 flase:失败
    */
    bool emitEvent( int eventId );

//类静态方法
public:
    /**
      @brief 添加一个事件回调
      @param managerName 事件管理器名字
      @param callback_name 回调名字
      @param callback 回调函数
      @param eventId 事件ID
      @param userCtx 事件发送时一同传入回调的参数
      @return true:成功 flase:失败
    */
    static bool registerEventCallback(const char* managerName, const char* callback_name ,EventCallback callback , int eventId , void* userCtx = NULL);

    /**
      @brief 添加一个事件回调
      @param managerName 事件管理器名字
      @param eventId 事件ID
      @return true:成功 flase:失败
    */
    static bool emitEvent(const char* managerName , int evenId );

    /**
      @brief 获取事件管理器实例
      @param managerName 事件管理器名字
      @return 事件管理器实例指针
    */
    static EventManager* getManagerInstance(const char* managerName);


//type
private:
    typedef struct{
        const char* callback_name;
        EventCallback cb;
        void* userCtx;
    }CallbackNode;

    typedef struct{
        int evendId;
        std::list<CallbackNode*> callbackNodeList;
    }EventIdNode;

//实例私有方法
private:
    void _managerThread();

//类私有成员
private:
    const char* _name;
    std::list<EventIdNode*> _eventIdNodeList;
    std::mutex* _eventIdNodeListLock;

    std::list<int> _eventList;
    std::mutex* _eventListLock;

    std::thread* _thread;
    std::mutex* _threadNotify;
    std::mutex* _threadDestroyedNotify;

//类公共私有成员
private:
    static std::list<EventManager*> _eventManagerList;
    static std::mutex               _eventManagerListLock;

//类公共方法
private:
    static EventIdNode* _addEventNode(int eventId , std::list<EventIdNode*>& nodeList);
    static EventIdNode* _findEventNode(int eventId , std::list<EventIdNode*>& nodeList);
};

#endif // EVENTMANAGER_H
